package demo.topic16;

import demo.topic15.Color;

import java.lang.annotation.*;

/**
 * 自定义注解
 *
 * 1. Retention 和 RetentionPolicy
 * （1）Annotation要想决定其作用的范围，通过@Retention指定，而Retention指定的范围由RetentionPolicy决定，
 * RetentionPolicy指定了三种范围：
 * （1.1）public static final RetentionPolicy SOURCE：在java源程序中存在 <
 * （1.2）public static final RetentionPolicy CLASS：在java生成的class中存在 <
 * （1.3）public static final RetentionPolicy RUNTIME：在java运行的时候存在
 *
 *
 * 2. 反射与Annotation
 * （1）一个Annotation真正起作用，必须结合反射机制，在反射中提供以下的操作方法：
 * （1.1）public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)：判断是否是指定的Annotation
 * （1.2）public Annotation[] getAnnotations()：得到全部的Annotation
 *
 *
 * 3. @Documented 注解
 * （1）表示的是文档化，可以在生成doc文档的时候添加注解
 *
 *
 * 4. @Inherited 注解
 * （1）表示的是一个Annotation是否被继承，默认是不被继承的
 *
 *
 * 5. @Target 注解
 * （1）表示的是一个Annotation的适用范围
 * （1.1）public static final ElementType TYPE; // 只能在类或接口或枚举上使用
 * （1.2）public static final ElementType FIELD; // 只能在字段（成员变量）上使用
 * （1.3）public static final ElementType METHOD; // 只能在方法上使用
 * （1.4）public static final ElementType PARAMETER; // 只能在方法参数上使用
 * （1.5）public static final ElementType CONSTRUCTOR; // 只能在构造方法上使用
 * （1.6）public static final ElementType LOCAL_VARIABLE; // 只能在局部变量上使用
 * （1.7）public static final ElementType ANNOTATION_TYPE; // 只能在注解类型上使用
 * （1.8）public static final ElementType PACKAGE; // 只能在包上使用
 *
 *
 */
@Documented
// 保留策略：运行时
@Retention(value= RetentionPolicy.RUNTIME)
// 应用范围：类
@Target(value= ElementType.TYPE)
// 继承
@Inherited
public @interface ClassAnnotation {
    public String name();
    public int age() default 1; // 定义默认值，使用时可以不赋值
    public Color color(); // 定义一个枚举类型的变量
    public String[] like();
}
